home *** CD-ROM | disk | FTP | other *** search
/ LOGIC Apps / Logic-APPLE_II_APPS.iso / mac / LOGIC Apple II 5.25" Library - ProDOS / PRO009.dsk / MISC / BYTE.ZAP.bas < prev    next >
BASIC Source File  |  2012-02-16  |  11KB  |  311 lines

  1. 100  REM   BZAP
  2. 110  REM    EDITS PRODOS DISK BLOCKS
  3. 120  DIM B2(50)
  4. 130 D$ =  CHR$(4)
  5. 140 X$ = "0123456789ABCDEF"
  6. 150 MO$ = "???JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
  7. 160 BF = 30000: REM    START OF BUFFER AREA
  8. 170 START = 20480:EN = 20552
  9. 180  FOR PLACE = START TO EN
  10. 190  READ CODE
  11. 200  POKE PLACE,CODE
  12. 210  NEXT PLACE
  13. 220  DATA    76,10,80,3,96,0,16,0,0,128
  14. 230  DATA    173,9,80,141,19,80,32,0,191,0
  15. 240  DATA    3,80,144,25,72,169,135,32,237,253
  16. 250  DATA   169,210,32,237,253,169,195,32,237,253
  17. 260  DATA   169,189,32,237,253,104,76,218,253,24
  18. 270  DATA    173,5,80,133,60,105,175,133,62,173
  19. 280  DATA    6,80,133,61,105,0,133,63,76,179
  20. 290  DATA    253,0,0 
  21. 300  INPUT "READ WHICH BLOCK INTO MEMORY? ";BN
  22. 310 X =  FRE(0)
  23. 320 BH =  INT(BN/256):BL = BN -(BH *256)
  24. 330  POKE ST +7,BL: POKE ST +8,BH
  25. 340  POKE ST +9,128: REM    READ BLK
  26. 350  INPUT "WHICH DISK DRIVE? ";DV
  27. 360  REM    SELECT INPUT DEVICE
  28. 370  IF DV = 1  THEN  POKE ST +4,96
  29. 380  IF DV = 2  THEN  POKE ST +4,224
  30. 390  INPUT "PRINT IT? (Y OR N): ";P1$
  31. 400  IF P1$ = "N"  OR P1$ = "n"  THEN  GOTO 430
  32. 410  PRINT D$;"PR#1"
  33. 420  PRINT : PRINT "BLOCK ";BN: PRINT 
  34. 430  POKE ST +5,0: POKE ST +6,128: REM    BUFFER
  35. 440  CALL 20480
  36. 450  PRINT : PRINT 
  37. 460  IF  PEEK(49183) >127  THEN  PRINT  CHR$(4);"PR#3": GOTO 480
  38. 470  PRINT D$;"PR#0"
  39. 480  IF OP = 3  THEN 520
  40. 490 CD = 0:CS = 0: REM   RESET CONTINUATION FLAGS
  41. 500  PRINT 
  42. 510  PRINT "BLOCK ";BN;" WAS READ INTO MEMORY AT $8000"
  43. 520  PRINT 
  44. 530  PRINT "YOUR CHOICES:"
  45. 540  PRINT 
  46. 550  PRINT "  1 = SHOW AS ASCII"
  47. 560  PRINT 
  48. 570  PRINT "  2 = CHANGE MEMORY"
  49. 580  PRINT 
  50. 590  PRINT "  3 = WRITE TO DISK"
  51. 600  PRINT 
  52. 610  PRINT "  4 = READ ANOTHER BLOCK"
  53. 620  PRINT 
  54. 630  PRINT "  5 = QUIT"
  55. 640  PRINT 
  56. 650  PRINT "  6 = DIRECTORY FORMAT"
  57. 660  PRINT 
  58. 670  PRINT "  7 = SUBDIRECTORY FORMAT"
  59. 680  PRINT 
  60. 690  INPUT "ENTER THE NUMBER: ";OP
  61. 700  ON OP GOTO 720,1250,1400,300,1460,1840,1660
  62. 710  GOTO 690
  63. 720  PRINT 
  64. 730  INPUT "PRINT IT? (Y OR N): ";P2$
  65. 740  IF P2$ = "N"  OR P2$ = "n"  THEN  GOTO 760
  66. 750  PRINT D$;"PR#1"
  67. 760  PRINT "BLOCK ";BN;":"
  68. 770  FOR BY = 32768 TO 33280  STEP 8
  69. 780 A1 =  PEEK(BY)
  70. 790 A2 =  PEEK(BY +1)
  71. 800 A3 =  PEEK(BY +2)
  72. 810 A4 =  PEEK(BY +3)
  73. 820 A5 =  PEEK(BY +4)
  74. 830 A6 =  PEEK(BY +5)
  75. 840 A7 =  PEEK(BY +6)
  76. 850 A8 =  PEEK(BY +7)
  77. 860  PRINT BY;": ";A1;" ";A2;" ";A3;" ";A4;" ";A5;" ";A6;" ";A7;" ";A8
  78. 870  PRINT "$";:D = BY: GOSUB 1580: PRINT H$;": ";
  79. 880 D = A1:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
  80. 890 D = A2:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
  81. 900 D = A3:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
  82. 910 D = A4:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
  83. 920 D = A5:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
  84. 930 D = A6:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
  85. 940 D = A7:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
  86. 950 D = A8: GOSUB 1580: PRINT H$
  87. 960  PRINT "ASCII: ";
  88. 970 A9 = A1: GOSUB 1100
  89. 980 A9 = A2: GOSUB 1100
  90. 990 A9 = A3: GOSUB 1100
  91. 1000 A9 = A4: GOSUB 1100
  92. 1010 A9 = A5: GOSUB 1100
  93. 1020 A9 = A6: GOSUB 1100
  94. 1030 A9 = A7: GOSUB 1100
  95. 1040 A9 = A8: GOSUB 1100
  96. 1050  PRINT 
  97. 1060  GOTO 1180
  98. 1070  IF D1 >9  AND D1 <16  THEN  PRINT " ";
  99. 1080  IF D1 >99  THEN  PRINT " ";
  100. 1090  RETURN 
  101. 1100  REM   
  102. 1110  IF A9 <32  THEN  PRINT "-";: GOTO 1140
  103. 1120  IF (A9 >127)  AND (A9 <160)  THEN  PRINT "-";: GOTO 1140
  104. 1130  PRINT  CHR$(A9);
  105. 1140  PRINT " ";
  106. 1150  IF A9 >9  THEN  PRINT " ";
  107. 1160  IF A9 >99  THEN  PRINT " ";
  108. 1170  RETURN 
  109. 1180  PRINT 
  110. 1190  REM    X
  111. 1200  NEXT BY
  112. 1210  PRINT 
  113. 1220  IF  PEEK(49183) >127  THEN  PRINT  CHR$(4);"PR#3": GOTO 500
  114. 1230  PRINT D$;"PR#0"
  115. 1240  GOTO 500
  116. 1250  PRINT 
  117. 1260  INPUT "CHANGE A RANGE OF ADDRESSES? (Y OR N): ";I$
  118. 1270  IF I$ = "N"  OR I$ = "n"  THEN 1350
  119. 1280  INPUT "START ADDRESS (DECIMAL): ";ST
  120. 1290  INPUT "END ADDRESS:";EN
  121. 1300  FOR AD = ST TO EN
  122. 1310  PRINT " CURRENT CONTENTS OF ADDRESS ";AD;" = "; PEEK(AD);: INPUT "NEW CONTENTS: ";NC
  123. 1320  POKE AD,NC
  124. 1330  NEXT AD
  125. 1340  GOTO 520
  126. 1350  INPUT "DECIMAL ADDRESS: ";AD
  127. 1360  PRINT "CONTAINS: "; PEEK(AD)
  128. 1370  INPUT "NEW CONTENTS: ";NC
  129. 1380  POKE AD,NC
  130. 1390  GOTO 520
  131. 1400  POKE ST +9,129: REM  WRITE BLK
  132. 1410  PRINT "BLOCK #";BN;" WAS READ INTO MEMORY"
  133. 1420  INPUT "WRITE MEMORY TO BLOCK #: ";BN
  134. 1430 BH =  INT(BN/256):BL = BN -(BH *256)
  135. 1440  POKE 12295,BL: POKE 12296,BH
  136. 1450  GOTO 350
  137. 1460  END 
  138. 1470  REM    HEX TO DEC
  139. 1480  REM    ENTER WITH HEX # AS H$
  140. 1490 D = 0: FOR C = 1 TO  LEN(H$)
  141. 1500 A$ =  MID$ (H$,C,1)
  142. 1510  IF A$ > = "0"  AND A$ < = "9"  THEN V =  VAL(A$): GOTO 1530
  143. 1520 V =  ASC(A$) -55
  144. 1530 D = D *16 +V
  145. 1540  NEXT C
  146. 1550  REM    DECIMAL OUTPUT IS D
  147. 1560  RETURN 
  148. 1570  REM    DEC TO HEX
  149. 1580  REM    ENTER WITH DEC # AS D
  150. 1590 H$ = ""
  151. 1600 Q =  INT(D/16)
  152. 1610 R = D -Q *16
  153. 1620 H$ =  MID$ (X$,R +1,1) +H$
  154. 1630  IF Q  THEN D = Q: GOTO 1600
  155. 1640  REM     HEX OUTPUT IS H$
  156. 1650  RETURN 
  157. 1660  REM    SUBDIRECTORY FORMAT
  158. 1670  GOSUB 1890
  159. 1680  IF H1$ < >"E"  THEN CS = 1: REM    NOT SUBDIR HEADER 
  160. 1690  IF CS = 1  THEN FL = 39:EB = 13:NF = 20: PRINT "CONTINUATION OF SUBDIRECTORY": GOTO 2310
  161. 1700  IF  LEN(H$) = 2  THEN H2$ =  RIGHT$(H$,1): PRINT "NAME LENGTH: ";H2$
  162. 1710  PRINT "SUBDIRECTORY NAME: ";
  163. 1720 NL = 15
  164. 1730 H$ = H2$: GOSUB 1470
  165. 1740  IF D <15  THEN NL = D
  166. 1750  FOR NB = 1 TO NL
  167. 1760  PRINT  CHR$( PEEK(BY +4 +NB));
  168. 1770  NEXT NB
  169. 1780  PRINT 
  170. 1790  GOSUB 2160
  171. 1800  PRINT "KEY BLOCK OF PARENT DIRECTORY: "; PEEK(BY +39) + PEEK(BY +40) *256
  172. 1810  PRINT "ENTRY NUMBER WITHIN PARENT DIR.: "; PEEK(BY +41)
  173. 1820  PRINT "LENGTH OF ENTRIES IN PARENT DIR.: "; PEEK(BY +42)
  174. 1830  GOTO 2310
  175. 1840  REM    DIR FORMAT
  176. 1850  REM    DIRECTORY HEADER
  177. 1860  GOSUB 1890
  178. 1870  GOSUB 2050
  179. 1880  GOTO 2290
  180. 1890  INPUT "PRINT IT? (Y OR N): ";P$
  181. 1900  IF P$ < >"Y"  THEN  GOTO 1920
  182. 1910  PRINT  CHR$(4);"PR#1"
  183. 1920  PRINT : PRINT "BLOCK ";BN: PRINT 
  184. 1930 BY = 32768: REM    START OF BUFFER
  185. 1940  FOR B1 = 0 TO 43
  186. 1950 B2(B1) = BY +B1
  187. 1960  NEXT B1
  188. 1970  PRINT "CONTINUED FROM BLOCK "; PEEK(B2(0)) +( PEEK(B2(1)) *256)
  189. 1980  PRINT "CONTINUED AT BLOCK "; PEEK(B2(2)) + PEEK(B2(3)) *256
  190. 1990 D =  PEEK(B2(4)): GOSUB 1580
  191. 2000 H1$ = H$
  192. 2010  IF  LEN(H$) = 2  THEN H1$ =  LEFT$(H$,1)
  193. 2020  GOSUB 2930: REM    GET STORAGE TYPE
  194. 2030  PRINT "STORAGE TYPE: ";ST$
  195. 2040  RETURN 
  196. 2050  IF H1$ < >"F"  THEN CD = 1: REM    NOT DIR HEADER
  197. 2060  IF CD = 1  THEN FL = 39:EB = 13:NF = 20: PRINT "CONTINUATION OF DIRECTORY": GOTO 2310
  198. 2070  IF  LEN(H$) = 2  THEN H2$ =  RIGHT$(H$,1): PRINT "NAME LENGTH: ";H2$
  199. 2080  PRINT "VOLUME NAME: ";
  200. 2090 NL = 15
  201. 2100 H$ = H2$: GOSUB 1470
  202. 2110  IF D <15  THEN NL = D
  203. 2120  FOR NB = 1 TO NL
  204. 2130  PRINT  CHR$( PEEK(BY +4 +NB));
  205. 2140  NEXT NB
  206. 2150  PRINT 
  207. 2160 B2 = BY:B5 = 28: REM   DATE BYTE
  208. 2170  GOSUB 3010: REM   GET DATE
  209. 2180  PRINT "CREATION DATE: "DT$;" ";TI$
  210. 2190  PRINT "PRODOS VERSION: "; PEEK(BY +32)
  211. 2200  PRINT "MINIMUM VERSION: "; PEEK(BY +33)
  212. 2210  PRINT "ACCESS: "; PEEK(BY +34)
  213. 2220 FL =  PEEK(BY +35)
  214. 2230  PRINT "LENGTH OF FILE ENTRIES: ";FL
  215. 2240 EB =  PEEK(BY +36)
  216. 2250  PRINT "ENTRIES PER BLOCK OF DIR: ";EB
  217. 2260 NF =  PEEK(BY +37) + PEEK(BY +38) *256
  218. 2270  PRINT "FILES IN DIRECTORY: ";NF
  219. 2280  RETURN 
  220. 2290  PRINT "LOCATION OF VOL BITMAP: "; PEEK(BY +39) + PEEK(BY +40) *256
  221. 2300  PRINT "TOTAL BLOCKS IN VOL: "; PEEK(BY +41) + PEEK(BY +42) *256
  222. 2310  PRINT 
  223. 2320  REM    SHOW FILE DATA
  224. 2330  FOR FILE = 1 TO NF
  225. 2340 H$ = "":H1$ = "":H2$ = ""
  226. 2350  REM    FILL ARRAY FOR FILE
  227. 2360  FOR B1 = 0 TO FL
  228. 2370 B2(B1) =  PEEK(BY +B1)
  229. 2380  NEXT B1
  230. 2390  REM    START AT 1ST FILE
  231. 2400  PRINT "FILE ENTRY ";FILE
  232. 2410 B2 = 32810 +((FILE -1) *FL) +1
  233. 2420  IF CD  THEN B2 = BY +4 +((FILE -1) *FL)
  234. 2430  REM     MAKE BYTE 0 INTO 2 CHAR STRING
  235. 2440 D =  PEEK(B2): GOSUB 1580: REM    GET HEX H$
  236. 2450  IF  LEN(H$) = 1  THEN H$ = "0" +H$
  237. 2460  IF  LEN(H$) >2  THEN H$ =  RIGHT$(H$,2): GOTO 2450
  238. 2470 H1$ =  LEFT$(H$,1)
  239. 2480 ST$ = H1$: GOSUB 2920
  240. 2490  PRINT "STORAGE TYPE:  ";ST$
  241. 2500 H2$ =  RIGHT$(H$,1)
  242. 2510 H$ = H2$: GOSUB 1470: REM    GET DECIMAL
  243. 2520  PRINT "NAME LENGTH: ";D
  244. 2530  PRINT "FILE NAME: ",
  245. 2540 NL = 15
  246. 2550  IF D <15  THEN NL = D
  247. 2560  IF D = 0  THEN NL = 15
  248. 2570  FOR NB = 1 TO NL
  249. 2580  PRINT  CHR$( PEEK(B2 +NB));
  250. 2590  NEXT NB
  251. 2600  PRINT 
  252. 2610  PRINT "FILE TYPE: ";
  253. 2620 D =  PEEK(B2 +16): GOSUB 1580
  254. 2630  IF H$ = "4"  THEN H$ = "TEXT"
  255. 2640  IF H$ = "6"  THEN H$ = "BINARY"
  256. 2650  IF H$ = "F"  THEN H$ = "DIRECTORY"
  257. 2660  IF H$ = "19"  THEN H$ = "APPLEWORKS DATABASE"
  258. 2670  IF H$ = "1A"  THEN H$ = "APPLEWORKS WP FILE"
  259. 2680  IF H$ = "1B"  THEN H$ = "APPLEWORKS SPREADSHEET"
  260. 2690  IF H$ = "EF"  THEN H$ = "PASCAL FILE"
  261. 2700  IF H$ = "F0"  THEN H$ = "COMMAND FILE"
  262. 2710  IF H$ = "FC"  THEN H$ = "APPLESOFT BASIC"
  263. 2720  IF H$ = "FD"  THEN H$ = "VARIABLE FILE"
  264. 2730  IF H$ = "FE"  THEN H$ = "RELOCATABLE CODE FILE"
  265. 2740  IF H$ = "FF"  THEN H$ = "SYSTEM FILE"
  266. 2750  PRINT H$
  267. 2760  PRINT "LOCATION OF KEY BLOCK: "; PEEK(B2 +17) + PEEK(B2 +18) *256
  268. 2770  PRINT "BLOCKS USED: "; PEEK(B2 +19) + PEEK(B2 +20) *256
  269. 2780  PRINT "LENGTH OF FILE: "; PEEK(B2 +21) + PEEK(B2 +22) *256 + PEEK(B2 +23) *65536
  270. 2790 B5 = 24: GOSUB 3010: REM   DATE
  271. 2800  PRINT "CREATION DATE: ";DT$;"  ";TI$
  272. 2810  PRINT "PRODOS VERSION: "; PEEK(B2 +28)
  273. 2820  PRINT "MINIMUM VERSION: "; PEEK(B2 +29)
  274. 2830  PRINT "ACCESS: "; PEEK(B2 +30)
  275. 2840  PRINT "AUX. TYPE: "; PEEK(B2 +31) + PEEK(B2 +32) *256
  276. 2850 B5 = 33: GOSUB 3010
  277. 2860  PRINT "DATE MODIFIED: ";DT$;"  ";TI$
  278. 2870  PRINT "DIRECTORY BLOCK: "; PEEK(B2 +37) + PEEK(B2 +38) *256
  279. 2880  PRINT 
  280. 2890  IF FILE = (EB -1)  THEN FILE = NF
  281. 2900  NEXT FILE
  282. 2905  FOR TM = 1 TO 2000: NEXT TM
  283. 2910  GOTO 450
  284. 2920  REM    STORAGE TYPE
  285. 2930  IF H1$ = "0"  THEN ST$ = "DELETED"
  286. 2940  IF H1$ = "1"  THEN ST$ = "SEEDLING"
  287. 2950  IF H1$ = "2"  THEN ST$ = "SAPLING"
  288. 2960  IF H1$ = "3"  THEN ST$ = "TREE"
  289. 2970  IF H1$ = "D"  THEN ST$ = "SUBDIRECTORY"
  290. 2980  IF H1$ = "E"  THEN ST$ = "SUBDIRECTORY HEADER"
  291. 2990  IF H1$ = "F"  THEN ST$ = "DIRECTORY HEADER"
  292. 3000  RETURN 
  293. 3010  REM   DATES
  294. 3020 DD =  PEEK(B2 +B5) - INT( PEEK(B2 +B5)/32) *32
  295. 3030 YY =  INT( PEEK(B2 +B5 +1)/2)
  296. 3040 MM = ( PEEK(B2 +B5 +1) -YY *2) *8 + INT( PEEK(B2 +B5)/32)
  297. 3050 MM$ =  MID$ (MO$,MM *3 +1,3)
  298. 3060  REM   READ SYSTEM TIME
  299. 3070 MI =  PEEK(B2 +B5 +2)
  300. 3080 HH =  PEEK(B2 +B5 +3)
  301. 3090  REM   CONVERT 24 HR TO 12
  302. 3100  IF HH >11  THEN PM = 1
  303. 3110  IF HH >12  THEN HH = HH -12
  304. 3120  IF HH = 0  THEN HH = 12
  305. 3130  IF DD = 0  THEN DT$ = "(NO DATE)":TIME$ = "(NO TIME)": GOTO 3190
  306. 3140 DT$ =  RIGHT$("00" + STR$(DD),2) +"-" +MM$ +"-" + RIGHT$("00" + STR$(YY),2)
  307. 3150 TIME$ =  RIGHT$("00" + STR$(HH),2) +":" + RIGHT$("00" + STR$(MI),2)
  308. 3160  IF PM = 1  THEN TIME$ = TIME$ +" PM"
  309. 3170  IF PM = 0  THEN TIME$ = TIME$ +" AM"
  310. 3180  REM   OUTPUT DT$, TI$
  311. 3190  RETURN